package docker

//	3.哈希槽分区			//大厂
//哈希解决的是映射问题，使用key的哈希值来计算所在的槽，便于数据分配。

/*

	目录
		1.为什么出现
		2.能干什么
		3.多少个hash槽
		3.hash槽的计算




-----------------------------1.为什么出现-----------------------------
	原因：
		因为一致性算法有数据倾斜的问题
		哈希槽实质就是一个数组，数组[0,2^14-1]形成 hash slot 空间。

-----------------------------2.能干什么-----------------------------

	目的：
		解决均匀分配的问题，
		在【数据和节点之间】又加入了一层，把这层称为哈希槽(slot)，
		用于【管理数据和节点之间的关系】，
		现在就相当于【节点上】放的【是槽】，【槽】里放的是【数据】。

		看图
			images/docker-1010-哈希算法：哈希槽分区-01.png
			images/docker-1011-哈希算法：哈希槽分区-02.png


		数据 --->	槽  ---->redis

		假如以前有8台redis，现在只需要找一个槽

		槽解决的是粒度问题，相当于把粒度变大了，这样便于数据移动。
		【哈希解决的是映射问题，使用key的哈希值来计算所在的槽，便于数据分配。】


-----------------------------3.多少个hash槽-----------------------------

	一个集群只能有16384个槽，编号0-16383(0-2^14-1)。
		看图
			images/docker-110-为什么redis集群的最大槽数是16384个？.png
			images/docker-111-为什么redis集群的最大槽数是16384个？-回答-01.png
			images/docker-112-为什么redis集群的最大槽数是16384个？-回答-02.png
			images/docker-113-为什么redis集群的最大槽数是16384个？-回答-03.png


	这些槽会分配给集群中的所有主节点，分配策略没有要求。
	可以指定哪些编号的槽分配给哪个主节点。集群会记录节点和槽的对应关系。
	解决了节点和槽的关系后，接下来就需要对key求哈希值，然后对16384取余，余数是几，key就落入对应的槽里。
	slot=CRC16(key) % 16384。以槽为单位移动数据，因为槽的数目是固定的，处理起来比较容易，这样数据移动问题就解决了。



-----------------------------hash槽的计算-----------------------------

		看图 images/docker-1012-哈希算法：哈希槽的计算-01.png

	hash槽的计算

	Redis集群中内置了16384个哈希槽，redis会根据节点数量大致均等的将哈希槽映射到不同的节点。
	当需要在Redis集群中放置一个key-value时,
	redis先对 key使用crc16算法算出一个结果，然后把结果对16384求余数，
	这样每个key都会对应一个编号在0-16383之间的哈希槽，也就是映射到某个节点上。

	如下代码，key之A、B在Node2，key之C落在Node3上
			看图 images/docker-1012-哈希算法：哈希槽的计算-01.png
*/
